# str格式化

# 要在最终结果中包含花括号，可在格式字符串中使用两个花括号（即{{或}}）来指定
s = "{{ceci n'est pas une replacement field}}".format()
print(s)  # {ceci n'est pas une replacement field}

#
s = "{foo} {} {bar} {}".format(1, 2, bar=4, foo=3)
print(s)  # 3 1 4 2
s = "{foo} {1} {bar} {0}".format(1, 2, bar=4, foo=3)
print(s)  # 3 2 4 1

#
fullname = ["Alfred", "Smoketoomuch"]
s = "Mr {name[1]}".format(name=fullname)
print(s)  # Mr Smoketoomuch

import math

tmpl = "The {mod.__name__} module defines the value {mod.pi} for π "
s = tmpl.format(mod=math)
print(s)  # The math module defines the value 3.141592653589793 for π

# 格式化字符串时 使用str、 repr和ascii进行转换
print("{pi!s}".format(pi='π'))  # π
print("{pi!r}".format(pi='π'))  # 'π'
print("{pi!a}".format(pi='π'))  # '\u03c0'

#
s = "The number is {num}".format(num=42)
print(s)  # The number is 42
# 指定浮点数 f
s = "The number is {num:f}".format(num=42)
print(s)  # The number is 42.000000
# b 将整数表示为二进制数
# c 将整数解读为Unicode码点
# d 将整数视为十进制数进行处理，这是整数默认使用的说明符
# e 使用科学表示法来表示小数（用e来表示指数）
# E 与e相同，但使用E来表示指数
# f 将小数表示为定点数
# F 与f相同，但对于特殊值（ nan和inf），使用大写表示
# g 自动在定点表示法和科学表示法之间做出选择。这是默认用于小数的说明符，但在默认情况下至少有1位小数
# G 与g相同，但使用大写来表示指数和特殊值
# n 与g相同，但插入随区域而异的数字分隔符
# o 将整数表示为八进制数
# s 保持字符串的格式不变，这是默认用于字符串的说明符
# x 将整数表示为十六进制数并使用小写字母
# X 与x相同，但使用大写字母
# % 将数表示为百分比值（乘以100，按说明符f设置格式，再在后面加上%）
print("The number is {num:b}".format(num=42))  # The number is 101010
print("The number is {num:d}".format(num=42))  # The number is 42
print("The number is {num:e}".format(num=42))  # The number is 4.200000e+01
print("The number is {num:E}".format(num=42))  # The number is 4.200000E+01
print("The number is {num:f}".format(num=42))  # The number is 42.000000
print("The number is {num:F}".format(num=42))  # The number is 42.000000
print("The number is {num:o}".format(num=42))  # The number is 52
print("The number is {num:x}".format(num=42))  # The number is 2a
print("The number is {num:X}".format(num=42))  # The number is 2A
print("The number is {num:%}".format(num=42))  # The number is 4200.000000%

# 显示宽度与对齐
print("左边{num:10}右边".format(num=3))  # 左边         3右边
print("左边{name:10}右边".format(name="Bob"))  # 左边Bob       右边

# 小数点位数 保留2位小数
print("Pi day is {pi:.2f}".format(pi=math.pi))  # Pi day is 3.14
# 小数点位数 保留2位小数，占10个字符串宽度，靠右对齐
print("Pi day is {pi:10.2f}".format(pi=math.pi))  # Pi day is       3.14

# 分隔符 逗号
print('One googol is {:,}'.format(10 ** 10))  # One googol is 10,000,000,000

# 10个字符填充0
print('{:010.2f}'.format(math.pi))  # 0000003.14

# 左对齐、右对齐和居中，可分别使用<、 >和^。
print('X{0:<10.2f}X\nX{0:^10.2f}X\nX{0:>10.2f}X'.format(math.pi))
# X3.14      X
# X   3.14   X
# X      3.14X

# 指定填充的符号，替换空格
print("{:$^15}".format(" WIN BIG "))  # $$$ WIN BIG $$$

# 说明符=，它指定将填充字符放在符号和数字之间
print('X{0:10.2f}X\nX{1:10.2f}X'.format(math.pi, -math.pi))
# X      3.14X
# X     -3.14X
print('X{0:10.2f}X\nX{1:=10.2f}X'.format(math.pi, -math.pi))
# X      3.14X
# X-     3.14X
print('X{0:10.2f}X\nX{1:$=10.2f}X'.format(math.pi, -math.pi))
# X      3.14X
# X-$$$$$3.14X

# 给正数加上符号，可使用说明符+（将其放在对齐说明符后面），而不是默认的-。如
# 果将符号说明符指定为空格，会在正数前面加上空格而不是+
print('{0:-.2}\n{1:-.2}'.format(math.pi, -math.pi))
# 3.1
# -3.1
print('{0:+.2}\n{1:+.2}'.format(math.pi, -math.pi))
# +3.1
# -3.1
print('X{0: .2}X\nX{1: .2}X'.format(math.pi, -math.pi))
# X 3.1X
# X-3.1X
# 对于二进制、八进制和十六进制转换，将加上一个前缀。
print("{:b}".format(42))  # 101010
print("{:#b}".format(42))  # 0b101010

# 类型g，它保留小数点后面的零）
print("{:g}".format(42))  # 42
print("{:#g}".format(42))  # 42.0000

#
width = int(35)
price_width = 10
item_width = width - price_width
header_fmt = '{{:{}}}{{:>{}}}'.format(item_width, price_width)
fmt = '{{:{}}}{{:>{}.2f}}'.format(item_width, price_width)
print('=' * width)
print(header_fmt.format('Item', 'Price'))
print('-' * width)
print(fmt.format('Apples', 0.4))
print(fmt.format('Pears', 0.5))
print(fmt.format('Cantaloupes', 1.92))
print(fmt.format('Dried Apricots (16 oz.)', 8))
print(fmt.format('Prunes (4 lbs.)', 12))
print('=' * width)
